package cn.edu.fzu.homemaking.helper;

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;

import org.apache.commons.codec.digest.DigestUtils;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

public class QRCodeHelper {

    public static final int    width  = 160;

    public static final int    height = 160;

    public static final String type   = "png";

    public static final String path   = "";

    /**
     * 定制二维码 宽高返回图片类型以及显示内容，链接请加上 http:// 或者 https://
     */
    private static BitMatrix buildQRCode(int width, int height, final String content) {
        // 定义二维码的配置，使用HashMap
        HashMap<EncodeHintType, Object> hints = new HashMap<>(3);
        // 字符集，内容使用的编码
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        // 容错等级，H、L、M、Q
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
        // 边距，二维码距离边的空白宽度
        hints.put(EncodeHintType.MARGIN, 2);
        try {
            // 生成二维码对象，传入参数：内容、码的类型、宽高、配置
            return new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
        } catch (Exception e) {

        }
        return null;
    }


    /**
     * 传入需要显示的内容，如果是链接请加上 http:// 或者 https:// 该方法返回的是一个stream
     */
    public static void buildQRCodeToBufferedImage(Integer width, Integer height, final String content,
                                                  OutputStream stream) {
        BitMatrix bitMatrix = buildQRCode(width, height, content);
        try {
            assert bitMatrix != null;
            MatrixToImageWriter.writeToStream(bitMatrix, type, stream);
        } catch (IOException e) {

        }
    }


    /**
     * 传入需要显示的内容，如果是链接请加上 http:// 或者 https://
     * 该方法是替换路径上的图片(md5(timestamp+content))，会存在服务器上,建议使用者后续自己删除
     */
    public static void buildQRCodeToImage(int width, int height, final String content) {
        // 生成二维码，传入二维码对象、生成图片的格式、生成的路径
        BitMatrix bitMatrix = buildQRCode(width, height, content);
        try {
            // 定义一个路径对象
            String fileName = path + DigestUtils.md5Hex((System.currentTimeMillis() + content).getBytes()) + "." + type;
            File file = new File(fileName);
            if (file.createNewFile()) {
                MatrixToImageWriter.writeToPath(bitMatrix, type, file.toPath());
            }
        } catch (IOException e) {

        }
    }
}
